home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 67651 / 67651.xpi / chrome / content / browser.js < prev    next >
Text File  |  2010-02-03  |  6KB  |  184 lines

  1. var BarTap = {
  2.  
  3.   mPrefs: Components.classes['@mozilla.org/preferences-service;1']
  4.           .getService(Ci.nsIPrefService).getBranch(null),
  5.  
  6.   handleEvent: function(event) {
  7.     switch (event.type) {
  8.     case 'DOMContentLoaded':
  9.       this.init();
  10.       return;
  11.     case 'SSTabRestoring':
  12.       this.onTabRestoring(event);
  13.       return;
  14.     }
  15.   },
  16.  
  17.   init: function() {
  18.     window.removeEventListener("DOMContentLoaded", this, false);
  19.     var tabbrowser = this.tabbrowser = document.getElementById("content");
  20.     this.tabbrowser.addEventListener("SSTabRestoring", this, false);
  21.  
  22.     /* Monkey patch our way into the tab browser.  This is by far the most
  23.        efficient but also ugliest way :\ */
  24.  
  25.     eval('tabbrowser.mTabProgressListener = '+tabbrowser.mTabProgressListener.toSource().replace(
  26.         /\{(this.mTab.setAttribute\("busy", "true"\);[^\}]+)\}/,
  27.         'if (!BarTap.onTabStateChange(this.mTab)) { $1 }'
  28.     ));
  29.  
  30.     eval('tabbrowser.updateCurrentBrowser = '+tabbrowser.updateCurrentBrowser.toSource().replace(
  31.         'newBrowser.setAttribute("type", "content-primary")',
  32.         'BarTap.onTabSelect(this.selectedTab); $&'
  33.     ));
  34.  
  35.     eval('tabbrowser.addTab = '+tabbrowser.addTab.toSource().replace(
  36.         'b.loadURIWithFlags(aURI, flags, aReferrerURI, aCharset, aPostData)',
  37.         'BarTap.writeBarTap(t, b, aURI, flags, aReferrerURI, aCharset, aPostData); $&'
  38.     ));
  39.   },
  40.  
  41.   /* Called when the browser wants to load stuff into a tab.  If the tab has
  42.      been placed on tap, stop the loading and defer to an event listener.
  43.      Returns true of the tab has been tapped. */
  44.   onTabStateChange: function(tab) {
  45.     if (tab.getAttribute("ontap") != "true") {
  46.       return false;
  47.     }
  48.  
  49.     /* We need these here because they leak into the event listener below. */
  50.     var browser = tab.linkedBrowser;
  51.     var history = browser.webNavigation.sessionHistory;
  52.     var bartap = browser.getAttribute("bartap");
  53.     var gotoindex;
  54.     var gotouri;
  55.  
  56.     browser.stop();
  57.  
  58.     if (bartap) {
  59.       /* The tab was likely opened by clicking on a link */
  60.       browser.removeAttribute("bartap");
  61.       bartap = JSON.parse(bartap);
  62.       gotouri = makeURI(bartap.uri);
  63.     } else if (history.count) {
  64.       /* Likely a restored tab, try loading from history. */
  65.       gotoindex = history.requestedIndex;
  66.       if (gotoindex == -1) {
  67.         gotoindex = history.index;
  68.       }
  69.       gotouri = history.getEntryAtIndex(gotoindex, false).URI;
  70.     } else if (browser.userTypedValue) {
  71.       /* This might not make much sense here... */
  72.       gotouri = makeURI(browser.userTypedValue);
  73.     }
  74.  
  75.     if (gotouri) {
  76.       /* See if we have title, favicon in stock for it. This should definitely
  77.          work for restored tabs as they're in the history database. */
  78.       let info = this.getInfoFromHistory(gotouri);
  79.       if (info) {
  80.         tab.setAttribute("image", info.icon);
  81.         tab.label = info.title;
  82.       } else {
  83.         /* Set a meaningful part of the URI as tab label */
  84.         let hostPort = gotouri.hostPort;
  85.         let path = gotouri.path;
  86.         if (hostPort.substr(0, 4) == "www.") {
  87.           hostPort = hostPort.substr(4);
  88.         }
  89.         if (path == "/") {
  90.           path = "";
  91.         }
  92.         tab.label = hostPort + path;
  93.       }
  94.     }
  95.  
  96.     browser.addEventListener("BarTapLoad", function() {
  97.         browser.removeEventListener("BarTapLoad", arguments.callee, false);
  98.         tab.removeAttribute("ontap");
  99.  
  100.         if (bartap) {
  101.           /* Gotta love the inconsistency of this API */
  102.           browser.loadURIWithFlags(
  103.             bartap.uri, bartap.flags,
  104.             makeURI(bartap.referrer),
  105.             bartap.charset, bartap.postdata);
  106.         } else if (history.count) {
  107.           browser.webNavigation.gotoIndex(gotoindex);
  108.         } else if (browser.userTypedValue) {
  109.           /* This might not make much sense here... */
  110.           browser.loadURI(browser.userTypedValue);
  111.         }
  112.       }, false);
  113.  
  114.     return true;
  115.   },
  116.  
  117.   onTabSelect: function(tab) {
  118.     if (tab.getAttribute("ontap") != "true") {
  119.       return;
  120.     }
  121.     let event = document.createEvent("Event");
  122.     event.initEvent("BarTapLoad", true, true);
  123.     tab.linkedBrowser.dispatchEvent(event);
  124.   },
  125.  
  126.   /* Called when a tab is opened with a new URI (e.g. by opening a link in
  127.      a new tab.) Stores the parameters on the tab so that 'onTabStateChange'
  128.      can carry out the action later. */
  129.   writeBarTap: function(aTab, aBrowser, aURI, aFlags, aReferrerURI, aCharset, aPostData) {
  130.     if (aURI && this.mPrefs.getBoolPref("extensions.bartap.tapBackgroundTabs")) {
  131.       let bartap = "";
  132.       if (aURI) {
  133.         bartap = JSON.stringify({
  134.           uri:      (aURI instanceof Ci.nsIURI) ? aURI.spec : aURI,
  135.           flags:    aFlags,
  136.           referrer: (aReferrerURI instanceof Ci.nsIURI) ? aReferrerURI.spec : aReferrerURI,
  137.           charset:  aCharset,
  138.           postdata: aPostData
  139.         });
  140.       }
  141.       aTab.setAttribute("ontap", "true");
  142.       aBrowser.setAttribute("bartap", bartap);
  143.     }
  144.   },
  145.  
  146.   /* Listens to the 'SSTabRestoring' event from the nsISessionStore service
  147.      and puts a marker on restored tabs. */
  148.   onTabRestoring: function(event) {
  149.     if (!this.mPrefs.getBoolPref("extensions.bartap.tapRestoredTabs")) {
  150.       return;
  151.     }
  152.     let tab = event.originalTarget;
  153.     if (tab === this.tabbrowser.selectedTab) {
  154.       return;
  155.     }
  156.     tab.setAttribute("ontap", "true");
  157.   },
  158.  
  159.   /* Get information about a URI from the history service,
  160.      e.g. title, favicon, ... */
  161.   getInfoFromHistory: function(aURI) {
  162.     var history = Cc["@mozilla.org/browser/nav-history-service;1"]
  163.                     .getService(Ci.nsINavHistoryService);
  164.  
  165.     var options = history.getNewQueryOptions();
  166.     options.queryType = 0;   // search history
  167.     options.maxResults = 1;
  168.  
  169.     var query = history.getNewQuery();
  170.     query.uri = aURI;
  171.  
  172.     var result = history.executeQuery(query, options);
  173.     result.root.containerOpen = true;
  174.  
  175.     if (!result.root.childCount) {
  176.       return null;
  177.     }
  178.     return result.root.getChild(0);
  179.   }
  180.  
  181. };
  182.  
  183. window.addEventListener("DOMContentLoaded", BarTap, false);
  184.